#include "Logger.h"
#include <sstream>

bool Logger::instanceFlag = false;
Logger* Logger::instance = NULL;
string Logger::logFilename = "./test/debug.log";

Logger::Logger(){
	this->debugActivo = false;
	this->nivelDebug = BAJO;
	logFile = new ArchivoTexto(logFilename,ArchivoTexto::ESCRITURA);
}

Logger* Logger::getInstance(){
    if(! instanceFlag){
        instance = new Logger();
        instanceFlag = true;
        return instance;
    }
    else {
        return instance;
    }
}

void Logger::setLogFilename(const string& fileName){
	logFilename = fileName;
	// Si existia un archivo abierto lo flusheo
	if ( logFile != NULL ){
		Logger::flush();
	}
	if(this->logFile)
		delete this->logFile ;

	logFile = new ArchivoTexto(fileName,ArchivoTexto::ESCRITURA);
	
}

void Logger::error(const string& clase, const string& metodo, const string& mensaje){
		logFile->escribir("ERROR : " + Logger::toUpper(clase) + " [" + metodo + "] " + mensaje );
		logFile->terminarLinea();
}

void Logger::debug(const string& clase, const string& metodo, const string&
		mensaje, enumNivelDeDebug nivelBebugElejido){
	if(this->debugActivo && nivelBebugElejido == this->nivelDebug){
		logFile->escribir("DEBUG : " + Logger::toUpper(clase) + " [" + metodo + "] " + mensaje );
		logFile->terminarLinea();
		logFile->flush();
	}
}

void Logger::debug(const string& clase, const string& metodo, std::stringstream msg,enumNivelDeDebug nivelBebugElejido){
	debug(clase,metodo,msg.str(),nivelBebugElejido);
}

void Logger::setDebug(bool valor){
	this->debugActivo = valor ;
}

void Logger::setNivelDebug(enumNivelDeDebug nuevoNivelBebug){
	this->nivelDebug = nuevoNivelBebug;
}

void Logger::flush(){
	logFile->flush();
}
string Logger::toUpper(string s) {
	for (size_t i = 0; i < s.length(); ++i) {
		s[i] = toupper(s[i]);
	};

	return s;
}
Logger::~Logger(){
	delete this->logFile;
	delete this->instance ;
}
